package greate.project;

import org.apache.camel.CamelContext;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.impl.DefaultCamelContext;

/**
 *  保证 route 的信息传递
 */
public class App03 {

    public static void main(String[] args) throws Exception {

        // 创建默认上下文
        CamelContext context = new DefaultCamelContext();

        // 现开启想表达的是 ， camel 在开启后可以动态的新增和关闭路由。
        context.start();

        // 新增路由
        context.addRoutes(new HelloWorldRoute01());
        context.addRoutes(new HelloWorldRoute02());

        Thread.sleep(3000);

        // 关闭 路由任务
        context.getRouteController().stopRoute("d");

        // 从上下文中删除路由
        context.removeRoute("d1");
        // 从上下文中删除路由
        context.removeRoute("d2");

        synchronized (App03.class){
            App03.class.wait();
        }

    }

    /**
     *  由下面的案例可以看出 camel
     */
    static class HelloWorldRoute01 extends RouteBuilder {
        @Override
        public void configure() throws Exception {

            final int[] init0 = {0};

            from("timer:foo?repeatCount=10&period=10ms")
                    // 设置head
                    .setHeader("init0" , () -> init0[0])
                    // 设置 body
                    .setBody(simple("message : ${headers.init0}"))
                    // log
                    .log("Provider Send Message. ${headers.init0}")
                    .process(exchange -> {

                        // 如果是 3 的倍数 停滞 3s。
                        if (init0[0]++ % 4==0) {
                            Thread.sleep(5000);
                        }
                    })
                    .to("direct:hello02");

        }
    }

    /**
     *  接受路由信息
     */
    static class HelloWorldRoute02 extends RouteBuilder {
        @Override
        public void configure() throws Exception {

            from("direct:hello02")
                    .process(exchange -> {
                        final Integer init0 = header("init0").evaluate(exchange, int.class);
                        if (init0%3==0) {
                            Thread.sleep(3000);
                        }
                    })
                    .log("Consumer Accept Message. : ${body} ; ${headers.init0}");

        }
    }


}
